# 程序设计总体思路：
# 一、导入库函数
# 二、导入UI文件
# 三、定义 1、Login(登录） 2、Register（注册） 3、MainWindow（主界面）三大类
# 四、执行主函数运行整个程序

# 三、 3：MainWindow（主界面）：① 定义构造方法（副类） ② 主题的切换 ③  按钮的连接 ④ 主题的变化 ⑤ 不同功能区的切换 ⑥ 数据库大分类、入账次数的创建 ⑦用户的创建与管理



##### 游标使用的讲解 #####
# 1.首先，使用mysql.connecter连接上mysql数据库，得到一个数据库对象。
# 2.然后，我们必须要开启数据库中的游标功能，得到一个游标对象。
# 3.接着，使用游标对象中的execute()方法，去执行某个SQL语句，系统会根据你的SQL语句，找到这些匹配行，给你存储起来，而不是一次性的打印到屏幕上。
# 什么时候需要这个结果中的数据的时候，你就去获取它。
# 4.最后，就是获取结果集中的数据了，这里有两种方法获取结果集中的数据。
# 一个是fetchone()，该方法一次获取一条记录，每一条记录是一个元组形式的数据，每获取一条记录游标会往前移动一格，等待获取下一条记录；
# 一个是fetchall()方法，能够一次性的获取所有的数据，该方法返回的是一个元组列表。
# 5.当完成所有操作后，记得断开数据库的连接，释放资源。


###### 关于MD5加盐:######
# 比如银行密码是”12345”
# 1.得到的MD5是:827ccb0eea8a706c4c34a16891f84e7b
# 2.一个人截取到这个密文,那么通过撞库肯定容易撞出12345.
# 3.我们要做的就是加盐,银行密码还是”12345”,然后我把银行密码加上我特定的字符串才计算MD5 
# 所以密码还是那个密码,但是变成求”12345密码加密987”的MD5值,然后再得到MD5,那么这个MD5起码可以确认那个数据库不会有



# 一、导入库函数
from PyQt5.QtWidgets import *
from PyQt5.uic import loadUiType
from database import get_con, close_con
import hashlib


# 二、导入UI文件
# UI--Logic分离
ui, _ = loadUiType('MainWindow.ui')  # 导入管理系统界面
login, _ = loadUiType('login2.ui')  # 导入登录界面
register, _ = loadUiType('register2.ui')  # 导入注册界面

# 三、1. 定义登录（Login）类
class Login(QWidget, login): # login这个变量代表导入的UI文件（见上方）
    def __init__(self):
        QWidget.__init__(self)
        self.setupUi(self)  # setupUi()函数用来初始化窗口
        self.login_Button.clicked.connect(self.handle_login)  # 登录按钮与跳转到主界面的函数相连接
        self.register_Button.clicked.connect(self.handle_register)  # 注册按钮与跳转到注册界面的函数相连接
    #    style = open("themes/darkorange.css", 'r')
    #    style = style.read()
    #    self.setStyleSheet(style)

    # MD5处理
    def md5(self, arg):
        hash = hashlib.md5(bytes("暴宇航", encoding="utf-8"))
        hash.update(bytes(arg, encoding='utf-8'))
        return hash.hexdigest()

    def handle_login(self):
        # 1、获取连接
        con = get_con()
        # 2、获取cursor（游标）
        cur = con.cursor()
        # 3、SQl语句
        sql = "select * from users where user_name = %s and user_password = %s"
        user_name = self.username.text()  # 获取文本框为username中的内容
        password = self.password.text()  # 获取文本框为password中的内容
        password = self.md5(password)  # 为密码进行md5加密
        # 4.执行语句
        cur.execute(sql, (user_name, password))  # 将
        data = cur.fetchone() # fetchone函数返回单个的元组给data，data[0]、data[1]分别是用户名和密码
        if data: # 若输入的是正确的用户名和密码，则执行以下主窗口启动程序
            self.main_login = MainWindow()  # 把注册界面Register()赋值给main_register，MainWindow是后面定义的类
            self.close() # 当前界面关闭
            self.main_login.show()  # 主界面打开

        else:
            self.error_message.setText("用户名或密码错误") # 使标签error_message显示这条消息

    # 从登录跳转到注册页面
    def handle_register(self):
        self.main_register = Register()  # 把注册界面Register()赋值给main_register
        self.close()  # 当前界面关闭
        self.main_register.show()  # 注册界面打开

# 三、2. 定义注册（Register）类
class Register(QWidget,register):
    def __init__(self):
        QWidget.__init__(self)
        self.setupUi(self)  # setupUi()函数用来初始化窗口
        self.register_Button.clicked.connect(self.handle_register)  # 注册按钮与注册账号的函数相连接
        self.back_Button.clicked.connect(self.back)  # 注册按钮与跳转到注册界面的函数相连接

    # MD5处理
    def md5(self, arg):
        hash = hashlib.md5(bytes("暴宇航", encoding="utf-8"))
        hash.update(bytes(arg, encoding='utf-8'))
        return hash.hexdigest()

    def back(self):      #定义返回登录界面的函数
        self.main_login=Login()
        self.close()
        self.main_login.show()

    def handle_register(self):
        #  数据库操作流程
        # 1、获取连接
        con = get_con()
        # 2、获取cursor
        cur = con.cursor()
        # 3、SQl语句
        sql = "insert into users(user_name, user_password, user_email) values(%s, %s, %s)"
        user_name = self.add_user_name.text()
        user_password = self.add_user_password.text()
        user_email = self.add_user_email.text()
        user_confirm_password = self.add_user_confirm_password.text()
        self.error_message.setText("")
        if user_password == user_confirm_password:  #如果两次密码一致则执行以下代码
            # 加盐
            # 加盐能使原先密码更加复杂，然后再执行md5加密
            hash = hashlib.md5(bytes("暴宇航", encoding="utf-8"))
            hash.update(bytes(user_password, encoding="utf-8"))
            user_password_hash = hash.hexdigest()
            # 4、执行语句
            cur.execute(sql, (user_name, user_password_hash, user_email))
            # 5、insert、update、delete必须显示提交
            con.commit()
            # 6、关闭资源
            close_con(con, cur)
            # 7、消息提示
            self.error_message.setText("注册成功")  # 给标签 error_message 改变成文本："注册成功"
            self.add_user_name.setText('')  # 清空add_user_name这一行文本框的内容
            self.add_user_password.setText('')
            self.add_user_confirm_password.setText('')
            self.add_user_email.setText('')

        else:
            self.error_message.setText("两次密码不一致")  # 给标签 error_message 改变成文本："两次密码不一致"
            self.add_user_password.setText('')
            self.add_user_confirm_password.setText('')

# 三、3. 定义收支管理系统主界面（MainWindow）类
class MainWindow(QMainWindow, ui):
    #  ①、定义构造方法（副类）
    def __init__(self):
        QMainWindow.__init__(self)
        self.setupUi(self)  # setupUi()函数用来初始化窗口
        self.handle_ui_change()  # 使主题切换界面在开始时隐藏
        self.handle_buttons()  # 实现对按钮功能的操控

        self.show_CreateIn()  # 显示已经添加的收入大分类
        self.show_CreateIn_combobox()  # 使创建的收入大分类combobox显示在“收支记录”界面的combobox中

        self.show_CreateOut()  # 显示已经添加的支出大分类
        self.show_CreateOut_combobox()

        self.show_Frequency()  # 显示已经添加的收入入账次数
        self.show_Frequency_combobox()

        self.show_Frequency2()  # 显示已经添加的支出入账次数
        self.show_Frequency_combobox2()

        self.show_bill()  # 显示收支情况
        self.show_bill2()

    #  ②、主题的切换
    #  UI变化处理
    def handle_ui_change(self):
        self.hide_themes()  # 开始时将主题切换界面隐藏
        self.ChangeWidget.tabBar().setVisible(False)  # 开始时使左侧功能按钮在上方的切换界面隐藏

    #  ③、按钮的连接
    # 所有Button的消息与槽的通信
    def handle_buttons(self):
        #  主题的按钮
        self.ThemeButton.clicked.connect(self.show_themes)  # 将按钮ThemeButton连接到槽show_themes函数上，实现主题显示
        self.HideButton.clicked.connect(self.hide_themes)  # 将按钮HideButton连接到槽hide_themes函数上，实现主题隐藏

        #  功能界面跳转的按钮
        self.SeeButton.clicked.connect(self.Tab_Change0)  # 将按钮SeeButton连接到槽Tab_Change0函数上，实现功能区切换
        self.InButton.clicked.connect(self.Tab_Change1)  # 将按钮CreateButton连接到槽Tab_Change1函数上，实现功能区切换
        self.TraceButton.clicked.connect(self.Tab_Change2)  # 将按钮InButton连接到槽Tab_Change2函数上，实现功能区切换
        self.CreateButton.clicked.connect(self.Tab_Change3)  # 将按钮OutButton连接到槽Tab_Change3函数上，实现功能区切换
        self.UserButton.clicked.connect(self.Tab_Change4)  # 将按钮TraceButton连接到槽Tab_Change4函数上，实现功能区切换

        #  收入大分类的按钮
        self.CreateInButton.clicked.connect(self.add_CreateIn)  # 将按钮CreateInButton连接到槽add_CreateIn函数上，实现收入分类创建
        self.DeleteInButton.clicked.connect(self.delete_CreateIn)  # 将按钮DeleteOutButton连接到槽delete_CreateOut函数上，实现收入分类删除

        #  支出大分类的按钮
        self.CreateOutButton.clicked.connect(self.add_CreateOut)  #  将按钮CreateOutButton连接到槽add_CreateOut函数上，实现支出分类创建
        self.DeleteOutButton.clicked.connect(self.delete_CreateOut)  # 将按钮DeleteOutButton连接到槽delete_CreateOut函数上，实现支出分类删除

        #  收入创建次数的按钮
        self.FrequencyButton.clicked.connect(self.add_Frequency)
        self.FrequencyDeleteButton.clicked.connect(self.delete_Frequency)

        #  支出创建次数的按钮
        self.FrequencyButton2.clicked.connect(self.add_Frequency2)
        self.FrequencyDeleteButton2.clicked.connect(self.delete_Frequency2)

        #  收入记录的按钮
        self.add_bill_save_Button.clicked.connect(self.add_bill)
        self.search_bill_Button.clicked.connect(self.search_bill)
        self.editor_bill_Button.clicked.connect(self.editor_bill)
        self.delete_bill_Button.clicked.connect(self.delete_bill)

        #  支出记录的按钮
        self.add_bill_save_Button2.clicked.connect(self.add_bill2)
        self.search_bill_Button2.clicked.connect(self.search_bill2)
        self.editor_bill_Button2.clicked.connect(self.editor_bill2)
        self.delete_bill_Button2.clicked.connect(self.delete_bill2)

        #  用户管理界面的按钮
        self.add_user_Button.clicked.connect(self.add_user)
        self.login_Button.clicked.connect(self.user_login)
        self.editor_user_Button.clicked.connect(self.editor_user)

    #  ④、主题的变化
    # 主题的显示
    def show_themes(self):
        self.ItemChange.show()

    # 主题的隐藏
    def hide_themes(self):
        self.ItemChange.hide()

    #  ⑤、不同功能区的切换
    # 选项卡联动
    # 使得左侧功能区按钮能够实现不同页面的转换
    # 收支查看功能切换
    def Tab_Change0(self):
        self.ChangeWidget.setCurrentIndex(0) # ChangeWidget是最外层的Tab Wiget组件
                                             # setCurrentIndex负责改变页面，0，1，2...分别代表不同页面

    # 分类创建功能切换
    def Tab_Change1(self):
        self.ChangeWidget.setCurrentIndex(1)

    # 收入记录功能切换
    def Tab_Change2(self):
        self.ChangeWidget.setCurrentIndex(2)

    # 支出记录功能切换
    def Tab_Change3(self):
        self.ChangeWidget.setCurrentIndex(3)

    # 记录查询功能切换
    def Tab_Change4(self):
        self.ChangeWidget.setCurrentIndex(4)

    #  ④、数据库大分类、入账次数的创建
    # 1.添加类别
    def add_CreateIn(self):
        # 数据库操作流程
        # 1.获取连接
        con = get_con() #调用py文件 database 的函数get_con
        # 2.获取cursor
        cur = con.cursor()
        # 3.SQL语句
        sql = "insert into classin(Big) values(%s)"
        Big = self.CreateInBig.text()   # 从总分类的文本框中取值,CreateInBig是总分类的文本框名
        # 4.执行语句
        cur.execute(sql, (Big, ))
        # 5.insert、update、delete必须显示提交
        con.commit()
        # 6.关闭资源
        close_con(con, cur)
        # 7.消息提示
        self.statusBar().showMessage('收入大分类创建成功！')
        self.show_CreateIn()  #显示已经添加进去的大分类


    # 显示已有类别，并且添加完毕后直接可以看到
    def show_CreateIn(self):
        con = get_con()
        cur = con.cursor()
        sql = "select Big from classin"
        cur.execute(sql)
        data = cur.fetchall()
        print(data)
        if data:
            self.ShowCreateIn.setRowCount(0)
            self.ShowCreateIn.insertRow(0)
            for row, form in enumerate(data):
                for column, item in enumerate(form):
                    self.ShowCreateIn.setItem(row, column, QTableWidgetItem(str(item)))
                    column += 1
                row_position = self.ShowCreateIn.rowCount()
                self.ShowCreateIn.insertRow(row_position)


    # 删除收入大分类
    def delete_CreateIn(self):
        #  数据库操作流程
        # 1、获取连接
        con = get_con()
        # 2、获取cursor
        cur = con.cursor()
        sql = "delete from classin where big = %s"
        big = self.CreateInBig.text()

        warning = QMessageBox.warning(self, '删除收入大分类', '你确定要删除',
                                      QMessageBox.Yes | QMessageBox.No)
        if warning == QMessageBox.Yes:
            cur.execute(sql, (big, ))
            con.commit()
            close_con(con, cur)
            self.show_CreateIn()
            self.statusBar().showMessage('收入大分类成功删除')



    # 将基础数据和combobox绑定
    def show_CreateIn_combobox(self):
        con = get_con()
        cur = con.cursor()
        sql = "select big from classin"
        cur.execute(sql)
        data = cur.fetchall()

        if data:
            self.add_bill_CreateIn.clear()
            self.editor_bill_CreateIn.clear()
            for CreateIn in data:
                self.add_bill_CreateIn.addItem(CreateIn[0])
                self.editor_bill_CreateIn.addItem(CreateIn[0])


    def add_Frequency(self):
        # 数据库操作流程
        # 1.获取连接
        con = get_con() #调用py文件 database 的函数get_con
        # 2.获取cursor
        cur = con.cursor()
        # 3.SQL语句
        sql = "insert into frequency(frequency) values(%s)"
        frequency = self.Frequency.text()   # 从入账次数的文本框中取值,Frequency是入账次数的文本框名
        # 4.执行语句
        cur.execute(sql, (frequency, ))
        # 5.insert、update、delete必须显示提交
        con.commit()
        # 6.关闭资源
        close_con(con, cur)
        # 7.消息提示
        self.statusBar().showMessage('入账次数添加成功！')
        self.show_Frequency()  #显示已经添加进去的入账次数


    # 显示已有类别，并且添加完毕后直接可以看到
    def show_Frequency(self):
        con = get_con()
        cur = con.cursor()
        sql = "select frequency from frequency"
        cur.execute(sql)
        data = cur.fetchall()
        print(data)

        if data:
            self.ShowFrequency.setRowCount(0)
            self.ShowFrequency.insertRow(0)
            for row, form in enumerate(data):
                for column, item in enumerate(form):
                    self.ShowFrequency.setItem(row, column, QTableWidgetItem(str(item)))
                    column += 1
                row_position = self.ShowFrequency.rowCount()
                self.ShowFrequency.insertRow(row_position)

    # 删除入账次数大分类
    def delete_Frequency(self):
        #  数据库操作流程
        # 1、获取连接
        con = get_con()
        # 2、获取cursor
        cur = con.cursor()
        sql = "delete from frequency where frequency = %s"
        frequency = self.Frequency.text()

        warning = QMessageBox.warning(self, '删除入账次数', '你确定要删除',
                                      QMessageBox.Yes | QMessageBox.No)
        if warning == QMessageBox.Yes:
            cur.execute(sql, (frequency, ))
            con.commit()
            close_con(con, cur)
            self.show_Frequency()
            self.statusBar().showMessage('入账次数成功删除')




    # 将基础数据和combobox绑定
    def show_Frequency_combobox(self):
        con = get_con()
        cur = con.cursor()
        sql = "select frequency from frequency"
        cur.execute(sql)
        data = cur.fetchall()

        if data:
            self.add_bill_Frequency.clear()
            self.editor_bill_Frequency.clear()
            for CreateIn in data:
                self.add_bill_Frequency.addItem(CreateIn[0])
                self.editor_bill_Frequency.addItem(CreateIn[0])



    # 2.添加类别
    def add_CreateOut(self):
        # 数据库操作流程
        # 1.获取连接
        con = get_con() #调用py文件 database 的函数get_con
        # 2.获取cursor
        cur = con.cursor()
        # 3.SQL语句
        sql = "insert into classout(outbig) values(%s)"
        out = self.CreateOutBig.text()   # 从支出总分类的文本框中取值,CreateOutBig是支出总分类的文本框名
        # 4.执行语句
        cur.execute(sql, (out, ))
        # 5.insert、update、delete必须显示提交
        con.commit()
        # 6.关闭资源
        close_con(con, cur)
        # 7.消息提示
        self.statusBar().showMessage('支出总分类创建成功！')
        self.show_CreateOut()  # 显示已经添加进去的支出总分类


    # 显示已有类别，并且添加完毕后直接可以看到
    def show_CreateOut(self):
        con = get_con()
        cur = con.cursor()
        sql = "select outbig from classout"
        cur.execute(sql)
        data = cur.fetchall()
        print(data)

        if data:
            self.ShowCreateOut.setRowCount(0)
            self.ShowCreateOut.insertRow(0)
            for row, form in enumerate(data):
                for column, item in enumerate(form):
                    self.ShowCreateOut.setItem(row, column, QTableWidgetItem(str(item)))
                    column += 1
                row_position = self.ShowCreateOut.rowCount()
                self.ShowCreateOut.insertRow(row_position)


    # 删除收入大分类
    def delete_CreateOut(self):
        #  数据库操作流程
        # 1、获取连接
        con = get_con()
        # 2、获取cursor
        cur = con.cursor()
        sql = "delete from classout where outbig = %s"
        out = self.CreateOutBig.text()

        warning = QMessageBox.warning(self, '删除支出总分类', '你确定要删除',
                                      QMessageBox.Yes | QMessageBox.No)
        if warning == QMessageBox.Yes:
            cur.execute(sql, (out, ))
            con.commit()
            close_con(con, cur)
            self.show_CreateOut()
            self.statusBar().showMessage('支出总分类成功删除')



    # 将基础数据和combobox绑定
    def show_CreateOut_combobox(self):
        con = get_con()
        cur = con.cursor()
        sql = "select outbig from classout"
        cur.execute(sql)
        data = cur.fetchall()

        if data:
            self.add_bill_CreateOut.clear()
            self.editor_bill_CreateOut.clear()
            for CreateOut in data:
                self.add_bill_CreateOut.addItem(CreateOut[0])
                self.editor_bill_CreateOut.addItem(CreateOut[0])



    def add_Frequency2(self):
        # 数据库操作流程
        # 1.获取连接
        con = get_con()  # 调用py文件 database 的函数get_con
        # 2.获取cursor
        cur = con.cursor()
        # 3.SQL语句
        sql = "insert into frequency2(frequency2) values(%s)"
        frequency = self.Frequency2.text()  # 从出账次数的文本框中取值,Frequency2是出账次数的文本框名
        # 4.执行语句
        cur.execute(sql, (frequency,))
        # 5.insert、update、delete必须显示提交
        con.commit()
        # 6.关闭资源
        close_con(con, cur)
        # 7.消息提示
        self.statusBar().showMessage('支出入账次数添加成功！')
        self.show_Frequency2()  # 显示已经添加进去的出账次数

        # 显示已有类别，并且添加完毕后直接可以看到

    def show_Frequency2(self):
        con = get_con()
        cur = con.cursor()
        sql = "select frequency2 from frequency2"
        cur.execute(sql)
        data = cur.fetchall()
        print(data)

        if data:
            self.ShowFrequency2.setRowCount(0)
            self.ShowFrequency2.insertRow(0)
            for row, form in enumerate(data):
                for column, item in enumerate(form):
                    self.ShowFrequency2.setItem(row, column, QTableWidgetItem(str(item)))
                    column += 1
                row_position = self.ShowFrequency2.rowCount()
                self.ShowFrequency2.insertRow(row_position)


    # 删除入账次数大分类
    def delete_Frequency2(self):
        #  数据库操作流程
        # 1、获取连接
        con = get_con()
        # 2、获取cursor
        cur = con.cursor()
        sql = "delete from frequency2 where frequency2 = %s"
        frequency = self.Frequency2.text()

        warning = QMessageBox.warning(self, '删除出账次数', '你确定要删除',
                                      QMessageBox.Yes | QMessageBox.No)
        if warning == QMessageBox.Yes:
            cur.execute(sql, (frequency,))
            con.commit()
            close_con(con, cur)
            self.show_Frequency2()
            self.statusBar().showMessage('出账次数成功删除')


    # 将基础数据和combobox绑定
    def show_Frequency_combobox2(self):
        con = get_con()
        cur = con.cursor()
        sql = "select frequency2 from frequency2"
        cur.execute(sql)
        data = cur.fetchall()

        if data:
            self.add_bill_Frequency2.clear()
            self.editor_bill_Frequency2.clear()
            for CreateOut in data:
                self.add_bill_Frequency2.addItem(CreateOut[0])
                self.editor_bill_Frequency2.addItem(CreateOut[0])

    #  ⑦、收支情况的增删改查
    # 添加收入情况
    def add_bill(self):
        #  数据库操作流程
        # 1、获取连接
        con = get_con()
        # 2、获取cursor
        cur = con.cursor()
        # 3、SQl语句
        sql = "insert into bill_in(bill_date,bill_amount,bill_remark, " \
             "bill_big,bill_frequency)  values(%s, %s, %s, %s, %s)"
        Date = self.add_bill_Date.text()
        Amount = self.add_bill_Amount.text()
        Remark = self.add_bill_Remark.text()
        Big = self.add_bill_CreateIn.currentText()
        Frequency = self.add_bill_Frequency.currentText()
        # 4、执行语句
        cur.execute(sql, (Date, Amount, Remark, Big, Frequency))
        # 5、insert、update、delete必须显示提交
        con.commit()
        # 6、关闭资源
        close_con(con, cur)
        # 7.消息提示
        self.statusBar().showMessage('收入情况添加成功！')
        self.show_bill()  # 显示已经添加进去的大分类
        self.add_bill_Date.setText('')
        self.add_bill_Amount.setText('')
        self.add_bill_Remark.setText('')
        self.add_bill_CreateIn.setCurrentIndex(0)
        self.add_bill_Frequency.setCurrentIndex(0)
      #  self.statusBar().showMessage('图书添加成功！')
      #  self.add_publisher_name.setText('')
      #  self.show_bill()

    # 查找收入情况
    def search_bill(self):
        con = get_con()
        cur = con.cursor()
    #    sql = "select * from bill_in where bill_date = %s"
        sql = "select * from bill_in where bill_big = %s and bill_frequency = %s"
    #    bill_date = self.editor_bill_Date.text()
        bill_big = self.editor_bill_CreateIn.currentText()
        bill_frequency = self.editor_bill_Frequency.currentText()
        cur.execute(sql, (bill_big, bill_frequency))
        data = cur.fetchone()
        if data:
            self.show_bill_CreateIn.setText(data[0])
            self.show_bill_Frequency.setText(data[1])
            self.show_bill_Date.setText(data[2])
            self.show_bill_Amount.setText(data[3])
            self.show_bill_Remark.setText(data[4])
        else:
            self.statusBar().showMessage('没有这个收入情况')

    # 修改收入情况
    def editor_bill(self):
        #  数据库操作流程
        # 1、获取连接
        con = get_con()
        # 2、获取cursor
        cur = con.cursor()
        # 3、SQl语句
        sql = "update bill_in set bill_date=%s, bill_amount=%s, bill_remark=%s where bill_big = %s and bill_frequency = %s"
        bill_date = self.show_bill_Date.text()
        bill_amount = self.show_bill_Amount.text()
        bill_remark = self.show_bill_Remark.text()
        bill_big = self.editor_bill_CreateIn.currentText()
        bill_frequency = self.editor_bill_Frequency.currentText()



        # 4、执行语句
        cur.execute(sql, (bill_date, bill_amount, bill_remark,
                          bill_big, bill_frequency))
        # 5、insert、update、delete必须显示提交
        con.commit()
        self.show_bill()
        self.statusBar().showMessage('收入情况修改成功！')

    # 删除收入情况
    def delete_bill(self):
        #  数据库操作流程
        # 1、获取连接
        con = get_con()
        # 2、获取cursor
        cur = con.cursor()
        sql = "delete from bill_in where bill_big = %s and bill_frequency = %s"
        bill_big = self.editor_bill_CreateIn.currentText()
        bill_frequency = self.editor_bill_Frequency.currentText()


        warning = QMessageBox.warning(self, '删除收入情况', '你确定要删除',
                                      QMessageBox.Yes | QMessageBox.No)
        if warning == QMessageBox.Yes:
            cur.execute(sql, (bill_big, bill_frequency))
            con.commit()
            close_con(con, cur)
            self.show_bill()
            self.statusBar().showMessage('收入情况成功删除')


    # 获取所有收入情况
    def show_bill(self):
        # 数据库操作流程
        # 1、获取连接
        con = get_con()
        # 2、获取cursor
        cur = con.cursor()
        sql = "select bill_date, bill_amount, bill_remark," \
              " bill_big, bill_Frequency from bill_in"

      #  sql = "select * from bill_in"
        cur.execute(sql)
        data = cur.fetchall()
        if data:
            self.In_Table.setRowCount(0)     # In_Table为收入情况显示框
            self.In_Table.insertRow(0)

            for row, form in enumerate(data):
                for column, item in enumerate(form):
                    self.In_Table.setItem(row, column, QTableWidgetItem(str(item)))
                    column += 1
                row_position = self.In_Table.rowCount()
                self.In_Table.insertRow(row_position)

    #  添加支出情况
    def add_bill2(self):
        #  数据库操作流程
        # 1、获取连接
        con = get_con()
        # 2、获取cursor
        cur = con.cursor()
        # 3、SQl语句
        sql = "insert into bill_out2(bill_date,bill_amount,bill_remark, " \
             "bill_out,bill_frequency)  values(%s, %s, %s, %s, %s)"
        Date = self.add_bill_Date2.text()
        Amount = self.add_bill_Amount2.text()
        Remark = self.add_bill_Remark2.text()
        Out = self.add_bill_CreateOut.currentText()
        Frequency = self.add_bill_Frequency2.currentText()
        # 4、执行语句
        cur.execute(sql, (Date, Amount, Remark, Out, Frequency))
        # 5、insert、update、delete必须显示提交
        con.commit()
        # 6、关闭资源
        close_con(con, cur)
        # 7.消息提示
        self.statusBar().showMessage('支出情况添加成功！')
        self.show_bill2()  # 显示已经添加进去的支出情况
        self.add_bill_Date2.setText('')
        self.add_bill_Amount2.setText('')
        self.add_bill_Remark2.setText('')
        self.add_bill_CreateOut.setCurrentIndex(0)
        self.add_bill_Frequency2.setCurrentIndex(0)
      #  self.statusBar().showMessage('图书添加成功！')
      #  self.add_publisher_name.setText('')
      #  self.show_bill()

    #  查找支出情况
    def search_bill2(self):
        con = get_con()
        cur = con.cursor()
    #    sql = "select * from bill_in where bill_date = %s"
        sql = "select * from bill_out2 where bill_out = %s and bill_frequency = %s"
    #    bill_date = self.editor_bill_Date.text()
        bill_out = self.editor_bill_CreateOut.currentText()
        bill_frequency = self.editor_bill_Frequency2.currentText()
        cur.execute(sql, (bill_out, bill_frequency))
        data = cur.fetchone()
        if data:
            self.show_bill_CreateOut.setText(data[0])
            self.show_bill_Frequency2.setText(data[1])
            self.show_bill_Date2.setText(data[2])
            self.show_bill_Amount2.setText(data[3])
            self.show_bill_Remark2.setText(data[4])
        else:
            self.statusBar().showMessage('没有这个支出情况')

    # 修改收入情况
    def editor_bill2(self):
        #  数据库操作流程
        # 1、获取连接
        con = get_con()
        # 2、获取cursor
        cur = con.cursor()
        # 3、SQl语句
        sql = "update bill_out2 set bill_date = %s, bill_amount = %s, bill_remark = %s where bill_out = %s and bill_frequency = %s"
        bill_date = self.show_bill_Date2.text()
        bill_amount = self.show_bill_Amount2.text()
        bill_remark = self.show_bill_Remark2.text()
        bill_out = self.editor_bill_CreateOut.currentText()
        bill_frequency = self.editor_bill_Frequency2.currentText()
        # 4、执行语句
        cur.execute(sql, (bill_date, bill_amount, bill_remark,
                          bill_out, bill_frequency))
        # 5、insert、update、delete必须显示提交
        con.commit()
        self.show_bill2()
        self.statusBar().showMessage('支出情况修改成功！')

    # 删除支出情况
    def delete_bill2(self):
        #  数据库操作流程
        # 1、获取连接
        con = get_con()
        # 2、获取cursor
        cur = con.cursor()
        sql = "delete from bill_out2 where bill_out = %s and bill_frequency = %s"
        bill_out = self.editor_bill_CreateOut.currentText()
        bill_frequency = self.editor_bill_Frequency2.currentText()
        warning = QMessageBox.warning(self, '删除支出情况', '你确定要删除',
                                      QMessageBox.Yes | QMessageBox.No)
        if warning == QMessageBox.Yes:
            cur.execute(sql, (bill_out, bill_frequency))
            con.commit()
            close_con(con, cur)
            self.show_bill2()
            self.statusBar().showMessage('支出情况成功删除')

    # 获取所有支出情况
    def show_bill2(self):
        # 数据库操作流程
        # 1、获取连接
        con = get_con()
        # 2、获取cursor
        cur = con.cursor()
        sql = "select bill_date, bill_amount, bill_remark," \
              "bill_out, bill_frequency from bill_out2"
      #  sql = "select * from bill_in"
        cur.execute(sql)
        data = cur.fetchall()
        if data:
            self.Out_Table.setRowCount(0)     # Out_Table为支出情况显示框
            self.Out_Table.insertRow(0)

            for row, form in enumerate(data):
                for column, item in enumerate(form):
                    self.Out_Table.setItem(row, column, QTableWidgetItem(str(item)))
                    column += 1
                row_position = self.Out_Table.rowCount()
                self.Out_Table.insertRow(row_position)


    #  ⑧、用户的创建与管理
    ######用户管理######
    def add_user(self):
        #  数据库操作流程
        # 1、获取连接
        con = get_con()
        # 2、获取cursor
        cur = con.cursor()
        # 3、SQl语句
        sql = "insert into users(user_name, user_password, user_email) values(%s, %s, %s)"
        user_name = self.add_user_name.text()
        user_password = self.add_user_password.text()
        user_email = self.add_user_email.text()
        user_confirm_password = self.add_user_confirm_password.text()
        self.error_message.setText("")
        if user_password == user_confirm_password:  #如果两次密码一致则执行以下代码
            # 加盐
            hash = hashlib.md5(bytes("暴宇航", encoding="utf-8"))
            hash.update(bytes(user_password, encoding="utf-8"))
            user_password_hash = hash.hexdigest()
            # 4、执行语句
            cur.execute(sql, (user_name, user_password_hash, user_email))
            # 5、insert、update、delete必须显示提交
            con.commit()
            # 6、关闭资源
            close_con(con, cur)
            # 7、消息提示
            self.statusBar().showMessage('用户添加成功！')
            self.add_user_name.setText('')
            self.add_user_password.setText('')
            self.add_user_confirm_password.setText('')
            self.add_user_email.setText('')

        else:
            self.error_message.setText("两次密码不一致")  # 给标签 error_message 改变成文本："两次密码不一致"
            self.add_user_password.setText('')
            self.add_user_confirm_password.setText('')


# MD5处理
    def md5(self, arg):
        hash = hashlib.md5(bytes("暴宇航", encoding="utf-8"))
        hash.update(bytes(arg, encoding='utf-8'))
        return hash.hexdigest()

    # 登录处理
    def user_login(self):
        con = get_con()
        cur = con.cursor()
        sql = "select * from users where user_name = %s and user_password = %s"
        old_user_name = self.old_user_name.text()
        editor_password = self.editor_password.text()
        password = self.md5(editor_password)
        cur.execute(sql, (old_user_name, password))
        data = cur.fetchone()

        if data:
            self.user_groupBox.setEnabled(True)    # groupBox是用户界面右下角的功能区，如果右上角的密码输入正确，则右下角功能区可以使用
            self.editor_user_name.setText(data[1])   # 给右下角的用户名赋值
            self.editor_user_email.setText(data[3])
            # print(data)


    # 修改用户信息
    def editor_user(self):
        old_name = self. old_user_name.text()
        new_name = self.editor_user_name.text()
        new_email = self.editor_user_email.text()
        user_password = self.eidtor_user_password.text()
        user_confirm_password = self.editor_user_confirm_password.text()
        if user_password == user_confirm_password:
            #  数据库操作流程
            # 1、获取连接
            con = get_con()
            # 2、获取cursor
            cur = con.cursor()
            if user_password == user_confirm_password:
                # 加盐
                hash = hashlib.md5(bytes("暴宇航", encoding="utf-8"))
                hash.update(bytes(user_password, encoding="utf-8"))
                user_password_hash = hash.hexdigest()
                sql = "update users set user_name = %s, user_email = %s, user_password = %s where user_name = %s"
                # 4、执行语句
                cur.execute(sql, (new_name, new_email, user_password_hash, old_name))
                # 5、insert、update、delete必须显示提交
                con.commit()
                # 6、关闭资源
                close_con(con, cur)
                # 7、消息提示
                self.statusBar().showMessage('用户修改成功！')
                self.user_groupBox.setEnabled(False)
        else:
            self.statusBar().showMessage('两次密码不一致！')

# 四、执行主函数运行整个程序
if __name__ == '__main__':
    app = QApplication([])  # QApplication 类管理图形用户界面应用程序的控制流和主要设置
    window = Login()   # 运行程序时开始显示登录界面
    window.show()  # 显示主窗口
    app.exec_()  # app.exec_()的作用是运行主循环，必须调用此函数才能开始事件处理